In [ ]:
import os
import numpy as np
import pandas as pd
import climin
import climin.stops
import theano
import theano.tensor as T
from breze.learn import sgvb
from breze.learn.base import theanox
from breze.arch.construct.layer.distributions import DiagGauss
from breze.arch.construct.neural import Mlp
import matplotlib
from matplotlib import pyplot as plt
%matplotlib inline
In [ ]:
GPU = theano.config.device.startswith('gpu')
if GPU:
import os
os.environ['GNUMPY_IMPLICIT_CONVERSION'] = 'allow'
In [ ]:
# forlder names for each object to be reconstructed
object_folders = ['cirPrism', 'fish', 'fishSQ', 'hut', 'hutWave', 'triangPrism']
In [ ]:
contact_objects = [np.array(pd.read_csv('data/'+f+'/set01-trial01//contactPoints.csv'))[:, :3] for f in object_folders]
contact = np.concatenate(contact_objects, 0).astype('float32')
taxel_objects = [pd.read_csv('data/'+f+'/set01-trial01//contactTactileRaw.csv') for f in object_folders]
taxel = np.concatenate(taxel_objects, 0).astype('float32')
In [ ]:
# split dataset
ind = np.arange(taxel.shape[0])
#np.random.shuffle(ind)
split = 0.7
In [ ]:
X = taxel[ind[:int(len(ind)*split)]]
TX = taxel[ind[int(len(ind)*split):]]
In [ ]:
mean = X.mean(0)
X -= mean
std = X.std(0)
X /= std
TX -= mean
TX /= std
In [ ]:
class MlpDiagConstVarGauss(DiagGauss):
def __init__(self, inpt, n_inpt, n_hiddens, n_output,
hidden_transfers, out_transfer_mean='identity',
declare=None, name=None, rng=None):
self.inpt = inpt
self.n_inpt = n_inpt
self.n_hiddens = n_hiddens
self.n_output = n_output
self.hidden_transfers = hidden_transfers
self.out_transfer_mean = out_transfer_mean
self.mean_mlp = Mlp(
self.inpt, self.n_inpt, self.n_hiddens, self.n_output,
self.hidden_transfers,
self.out_transfer_mean,
declare=declare)
self.std = declare((1, n_output))
super(MlpDiagConstVarGauss, self).__init__(
self.mean_mlp.output,
T.exp(self.std))
class MlpGaussConstVarVisibleVAEMixin(object):
def make_gen(self, latent_sample):
return MlpDiagConstVarGauss(
latent_sample, self.n_latent,
self.n_hiddens_gen,
self.n_inpt,
self.gen_transfers,
declare=self.parameters.declare)
class MyVae(sgvb.VariationalAutoEncoder,
sgvb.MlpGaussLatentVAEMixin,
MlpGaussConstVarVisibleVAEMixin):
pass
optimizer = 'rmsprop', {'step_rate': 0.001}
batch_size = 200
n_latent = 5
hiddens_recog = [512] * 2
m = MyVae( int(X.shape[1]),
hiddens_recog, n_latent, [512] * 2,
['sigmoid'] * 2, ['sigmoid'] * 2,
optimizer=optimizer, batch_size= batch_size)
In [ ]:
climin.initialize.randomize_normal(m.parameters.data, 0, 0.1)
In [ ]:
m.optimizer = 'adam'
In [ ]:
max_passes = 1000
max_iter = max_passes * X.shape[0] / batch_size
n_report = X.shape[0] / batch_size
stop = climin.stops.AfterNIterations(max_iter)
pause = climin.stops.ModuloNIterations(n_report)
for i, info in enumerate(m.powerfit((X,), (X[0:1],), stop, pause)):
print i, info['loss'], info['val_loss']
In [ ]:
f_latents = m.function(['inpt'], m.vae.recog.sample())
f_meanvar = m.function(['inpt'], m.vae.recog.stt)
In [ ]:
for c, t, f in zip(contact_objects, taxel_objects, object_folders):
plt.figure()
l=f_meanvar(theanox((t-mean)/std).astype('float32'))
for i in range(l.shape[1]):
plt.scatter(c[:, 0], c[:, 1], c=l[:,i])
plt.axis('equal')
plt.savefig('data/'+f+'/latent_'+str(i)+'.png')
In [ ]:
for i,l in enumerate(m.vae.recog.mlp.layers):
np.save('data/W' + str(i) + '.npy', m.parameters[l.weights])
np.save('data/b' + str(i) + '.npy', m.parameters[l.bias])
np.save('data/mean.npy', mean)
np.save('data/std.npy', std)
In [ ]:
__latents = np.genfromtxt('./data/cirPrism/set01-trial01/latent.csv', delimiter=',')
__coord = np.genfromtxt('./data/cirPrism/set01-trial01/contactPoints.csv', delimiter=',')
In [ ]:
plt.scatter(__coord[:, 0], __coord[:, 1], c=__latents[:,1])
plt.axis('equal');
In [ ]:
In [ ]: